
package com.itheima.health.service.impl;


import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;

import com.itheima.health.pojo.Permission;
import com.itheima.health.pojo.Role;
import com.itheima.health.service.RoleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Transactional
@Service
@Slf4j
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleDao roleDao;

    /*查询所有角色*/
    @Override
    public PageResult findAll(QueryPageBean queryPageBean) {
        //使用PageHelper, 设置分页查询初始信息( 当前页码, 每页条数
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //调用dao, 获取到满足条件(queryString)的信息

        Page<Role> page = roleDao.findAll(queryPageBean.getQueryString());
        //封装PageResult对象, 并返回
        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());
        return pageResult;
    }

    /*     * 新增角色*/
    @Override
    public void add(Permission permission, Integer[] checkgroupIds) {
        //保存角色


        roleDao.add(permission);
        //        //保存角色与权限的关系 (操作中间表)
        for (Integer checkgroupId : checkgroupIds) {
            //封装Map集合
            Map<String, Integer> map = new HashMap<>();
            map.put("role_id", permission.getId());
            map.put("permission_id", checkgroupId);

            //调用dao方法, 把角色ID与勾选的权限Id 存入中间表( t_rolet_role_permission)
            roleDao.addpermissionAndrole(map);
        }
    }

    /*删除角色*/
    @Override
    public void deleteById(Integer id) {
        //通过检查项ID, 去中间表中查询,  检查组是否用到了该检查项
        Long count = roleDao.countRoleById(id);
        if (count >0){
            //说明检查组中使用了该检查项, 该检查项不能被删除
            throw new RuntimeException("检查组中使用了该检查项, 该检查项不能被删除");
        }
        //说明 当前的检查项没有被引用, 可以删除
        roleDao.deleteById(id);
    }
/** 基于角色id 查询角色对象*/
    @Override
    public Role findById(Integer id) {

        /**
         * 基于角色id  查询 角色对象
         *
         */
            //调用dao层 findById方法, 获取角色对象
            return roleDao.findById(id);
        }
    /**
     * 基于角色Id 查询关联的权限项id
     */
    @Override
    public List<Integer> roleIdByPermissionId(Integer id) {
        //调用dao层 roleIdByPermissionId, 获取permissiond的ID
        return roleDao.roleIdByPermissionId(id);
    }
    /**
     * 更新检查组
     * 前端页面传递过来的新增角色的表单数据
     * 前端页面传递过来的新增角色所关联的权限ID
     *
     * @return
     */
    @Override
    public void edit(Role role, Integer[] checkItemIds) {
        //更新角色信息
        roleDao.edit(role);
        //删除角色旧的依赖关系( 角色与勾选的权限的关系 [从中间表删除数据] )
        roleDao.deleteRoleIdAndpermission(role.getId());
        //重新 建立新角色的依赖关系( 角色与勾选的权限的关系[从中间表添加数据] )
        for (Integer checkItemId : checkItemIds) {
            //建立Map集合, 用于保存每一次sql执行时 用到的 角色组ID与 权限项ID
            Map<String, Integer> map = new HashMap<>();
            map.put("role_id", role.getId());
            map.put("permission_id", checkItemId);

            roleDao.addRoleIdAndpermission(map);
        }

    }

}
